Earliest Deadline First Scheduling Algorithm
Introduction​
The Earliest Deadline First (EDF) algorithm is a dynamic priority scheduling technique used in real-time operating systems. In EDF, each process is assigned a deadline, and the CPU is allocated to the process with the closest deadline. This approach ensures that time-critical tasks are executed in a timely manner.
Example​
Consider three processes with the following burst times and deadlines:
- Process 1:
3 units
(Deadline at time 4) - Process 2:
2 units
(Deadline at time 2) - Process 3:
1 unit
(Deadline at time 3)
Using the EDF algorithm, the processes will be executed in the order of their deadlines: Process 2, Process 3, and then Process 1.
Problem Definition​
Given a list of processes along with their burst times and deadlines, calculate the waiting times, turnaround times, average waiting time, and average turnaround time for the processes.
Key Concepts​
- Waiting Time: The amount of time a process spends waiting in the queue before it starts executing.
- Turnaround Time: The total time taken for a process from arrival to completion, which includes both the waiting time and the burst time.
EDF Scheduling Approach​
In the Earliest Deadline First algorithm:
- The process with the earliest deadline is selected for execution next.
- The algorithm continuously evaluates the deadlines of all ready processes and adjusts the schedule dynamically.
Code Implementation in Python​
Below is the Python implementation for the Earliest Deadline First scheduling algorithm:
from typing import List, Tuple
def calculate_wait_times(processes: List[Tuple[int, int, int]]) -> List[int]:
"""
Calculate the waiting times for a list of processes given their burst times and deadlines.
"""
# Sort processes by deadline
processes.sort(key=lambda x: x[2]) # Sort by deadline
n = len(processes)
wait_times = [0] * n
for i in range(1, n):
wait_times[i] = processes[i - 1][1] + wait_times[i - 1]
return wait_times
def calculate_turnaround_times(processes: List[Tuple[int, int, int]], wait_times: List[int]) -> List[int]:
"""
Calculate the turnaround times for a list of processes.
Turnaround time is the sum of waiting time and burst time for each process.
"""
return [processes[i][1] + wait_times[i] for i in range(len(processes))]
def calculate_avg_turnaround_time(turnaround_times: List[int]) -> float:
"""
Calculate the average turnaround time for a list of processes.
"""
return sum(turnaround_times) / len(turnaround_times)
def calculate_avg_wait_time(wait_times: List[int]) -> float:
"""
Calculate the average waiting time for a list of processes.
"""
return sum(wait_times) / len(wait_times)
if __name__ == "__main__":
processes = [(1, 3, 4), (2, 2, 2), (3, 1, 3)] # List of (process_id, burst_time, deadline)
# Calculate waiting times and turnaround times
wait_times = calculate_wait_times(processes)
turnaround_times = calculate_turnaround_times(processes, wait_times)
# Calculate average waiting time and average turnaround time
avg_wait_time = calculate_avg_wait_time(wait_times)
avg_turnaround_time = calculate_avg_turnaround_time(turnaround_times)
# Display process details and calculated times
print("Process ID\tBurst Time\tDeadline\tWaiting Time\tTurnaround Time")
for i, (process_id, burst_time, deadline) in enumerate(processes):
print(f"{process_id}\t\t{burst_time}\t\t{deadline}\t\t{wait_times[i]}\t\t{turnaround_times[i]}")
# Display averages
print(f"Average waiting time = {avg_wait_time}")
print(f"Average turnaround time = {avg_turnaround_time}")
Explanation of the Code​
- Waiting Time Calculation: Processes are sorted by their deadlines, and the waiting time for each process is calculated based on the burst time of the previous processes.
- Turnaround Time Calculation: Turnaround time is computed as the sum of the waiting time and the burst time for each process.
- Average Times: The average waiting time and average turnaround time are calculated by taking the sum of the respective times and dividing by the total number of processes.
Example Output​
For the input where processes are [(1, 3, 4), (2, 2, 2), (3, 1, 3)], the output is as follows:
Process ID Burst Time Deadline Waiting Time Turnaround Time
2 2 2 0 2
3 1 3 2 3
1 3 4 5 8
Average waiting time = 2.33
Average turnaround time = 4.33
Time and Space Complexity​
- Time Complexity: The time complexity is O(n log n) due to the sorting of processes, where n is the number of processes.
- Space Complexity: The space complexity is O(n) due to the storage of waiting times and turnaround times.
Conclusion​
The Earliest Deadline First scheduling algorithm is an effective approach for real-time systems, ensuring that time-critical tasks are executed before their deadlines. However, it can lead to challenges such as deadline misses if the system is overloaded.